Learn Objective C(4)Programming with Objective-C - Encapsulating Data and Customizing Existing Classes
3. Encapsulating Data
3.1 Properties Encapsulate an Object's Values
Declare Public Properties for Exposed Data
@interface ZJUPerson : NSObject
@property NSString *firstName
@property NSString *lastName
@end
Use Accessor Methods to Get or Set Property Values
NSString *firstName = [somePerson firstName];
[somePerson setFirstName:@"Carl"];
By default, these accessor methods are synthesized automatically for you by the compiler.
@property (readonly) NSString *fullName;
The opposite of readonly is readwrite, it is default.
@property (getter=isFinished) BOOL finished;
@property (readonly, getter=isFinished) BOOL finished;
Dot Syntax Is a Concise Alternative to Accessor Method Calls
NSString *firstName = somePerson.firstName;
somePerson.firstName = @"Carl";
Getting a value using somePerson.firstName is the same as using [somePerson firstName]
Setting a value using somePerson.firstName = @"Carl" is the same as using [somePerson setFirstName: @"Carl"];
Most Properties Are Backed by Instance Variables
For a property called firstName, the synthesized instance variable will be called _firstName.
- (void) someMethod {
NSString *myString = @"an string";
_someString = myString;
}
_someString is an instance variable.
- (void) someMethod {
NSString *myString = @"an string";
self.someString = myString;
}
You can Customize Synthesized Instance Variable Names
@implementation YourClass
@synthesize propertyName = instanceVariableName;
…snip…
@end
The default is @synthesize firstName = firstName;
But we should always use
@synthesize firstName = _firstName;
You Can Define Instance Variables without Properties
It is best practice to use a property on an object any time you need to keep track of a value.
If we want to define our own instance variables without declaring a property, we can add them insides braces at the top of the class interface or implementation.
@interface SomeClass : NSObject {
NSString *_myNonPropertyInstanceVariable;
}
@end
@implementation SomeClass {
NSString *_anotherCustomInstanceVariable;
}
@end
Access Instance Variables Directly from Initializer Methods
Creating the initialize methods.
- (id)initWithFirstName:(NSString *)aFirstName lastName:(NSString *) aLastName;
- (id)initWithFirstName:(NSString *)aFirstName lastName:(NSString *) aLastName {
self = [super init];
if(self){
_firstName = aFirstName;
_lastName = aLastName;
}
return self;
}
The Designated Initializer is the Primary Initialization Method
We need to define one designated initializer among a lot of initialization methods.
You Can Implement Custom Accessor Methods
@property (readonly) NSString *fullName;
- (NSString *) fullName {
return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}
Properties Are Atomic by Default
@interface ZJUObject : NSObject
@property NSObject *firstObject; //atomic by default
@property (atomic) NSObject *secondObject //
@end
From different threads, it is always fully retrieved by the getter method or fully set via the setter method.
atomic -- nonatomic
@interface ZJUObject : NSObject
@property (nonatomic) NSObject *oneobject;
@end
@implementation ZJUObject
- (NSObject *) oneobject {
return _oneobject;
}
//setter will be synthesized automatically
@end
3.2 Manage the Object Graph through Ownership and Responsibility
In Objective-C, an object is kept alive as long as it has at least one strong reference to it from another object.
ZJUPerson Object
@property NSString *firstName; -----strong -----> NSString Object @"Carl"
@property NSString *lastName; ------strong -----> NSString Object @"Luo"
Avoid Strong Reference Cycles
If a group of objects is connected by a circle of strong relationships, they keep each other alive even if there are no strong references from outside the group.
A strong reference circle
NSTableView -------> strong ------> Delegate Object
@property id delegate <------- strong -------- @property NSTableView *tableView;
NSTableView -------> weak ------> Delegate Object
@property (weak) id delegate <------- strong -------- @property NSTableView *tableView;
Use Strong and Weak Declarations to Manage Ownership
By default the references are strong
@property id delegate;
@property (weak) id delegate;
Local variables also maintain strong references to objects by default. If we don't want a variable to maintain a strong reference, we can declare __weak
NSObject *__weak weakVariable;
Use Unsafe Unretained References for Some Classes
@property (unsafe_unretatined) NSObject *unsafeProperty;
NSObject * __unsafe_unretained unsafeReference;
Copy Properties Maintain Their Own Copies
@interface ZJUBadgeView : NSView
@property NSString *firstName;
@property NSString *lastName;
@end
NSMutableString *nameString = [NSMutableString stringWithString:@"John"];
self.badgeView.firstName = nameString;
nameString appendString:@"ny";
The object ZJUBadgeView will change after the append action. So we need a copy of the value for the object in some circumstances.
@interface ZJUBadgeView : NSView
@property (copy) NSString *firstName;
@property (copy) NSString *lastName;
@end
alternatively
- (id) initWithSomeOriginalString:(NSString *) aString {
self = [super init];
if (self) {
_instanceVariableForCopyProperty = [aString copy];
}
return self;
}
4. Customizing Existing Classes
4.1 Categories Add Methods to Existing Classes
@interface ClassName (CategoryName)
@end
At runtime, there is no difference between a method added by a category and one that is implemented by the original class.
Write the Category for ZJUPerson class like this.
#import "ZJUPerson.h"
@interface ZJUPerson (ZJUPersonNameDisplayAddtions)
- (NSString *) lastNameFirstNameString;
@end
A category is usually declared in a separate header file and implemented in a separate source code file. For example
ZJUPerson+ZJUPersonNameDisplayAdditions.h
The category implementation is as follow:
#import "ZJUPerson+ZJUPersonNameDisplayAdditions.h"
@implementation ZJUPerson ( ZJUPersonNameDisplayAdditions)
- (NSString *) lastNameFirstNameString {
return [NSString stringWithFormat: @"%@, %@", self.lastName, self.firstName];
}
@end
After implement the Category, we can use that method both in ZJUPerson class itself or the sub classes.
#import "ZJUPerson+ZJUPersonNameDisplayAdditions.h"
@implementation SomeObject
- (void) someMethod {
ZJUPerson *person = [[ZJUPerson alloc] initWithFirstName:@"Carl"
lastname:@"Luo"];
NSLog(@"The people is %@", [person lastnameFirstNameString]);
}
@end
We can provide different implementations for the category methods, depending on whether I am writing an app for OS X or iOS.
Avoid Category Method Name Clashes
We need to be very careful about method names, if the name of a method declared in a category is the same as a method in the original class, or a method in another category on the same class (or even a superclass), the behavior is undefined as to which method implementation is used at runtime.
To solve the clashes, it is best practice to add a prefix to the method name.
+ (id) zju_sortDescriptorWithKey: (NSString *) key ascending: (BOOL) ascending;
4.2 Class Extensions Extend the Internal Implementation
A class extension bears some similarity to a category, but it can only be added to a class for which you have the source code at compile time.
There is no way to declare a class extension on a framework class.
@interface ClassName ()
@end
Since there is not name in the parentheses, class extensions are often referred to as anonymous categories. We can define the properties then.
@interface ZJUPerson ()
@property NSObject *extraProperty;
@end
Use Class Extensions to Hide Private Information
…snip...
Consider Other Alternatives for Class Customization
…snip...
References:
https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW1
- 浏览: 2567125 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
-
nation:
你好,在部署Mesos+Spark的运行环境时,出现一个现象, ...
Spark(4)Deal with Mesos -
sillycat:
AMAZON Relatedhttps://www.godad ...
AMAZON API Gateway(2)Client Side SSL with NGINX -
sillycat:
sudo usermod -aG docker ec2-use ...
Docker and VirtualBox(1)Set up Shared Disk for Virtual Box -
sillycat:
Every Half an Hour30 * * * * /u ...
Build Home NAS(3)Data Redundancy -
sillycat:
3 List the Cron Job I Have>c ...
Build Home NAS(3)Data Redundancy
发表评论
-
ionic UI(5)UI and Backend
2016-12-02 03:22 606ionic UI(5)UI and Backend 1 Pr ... -
Stanford Cource(2)Demo App Caculator
2014-06-24 01:29 917Stanford Cource(2)Demo App Ca ... -
Mono on MAC
2014-06-04 03:27 1002Mono on MACJust fine the tool f ... -
IOS7 App Development Essentials(4)IPhone5, IPhone5s, IPhone5c
2014-04-11 03:59 1000IOS7 App Development Essentia ... -
IOS7 App Development Essentials(3)NSUserDefaults
2014-04-11 02:58 1023IOS7 App Development Essentia ... -
IPhone and Location(2)Documents Region Monitoring and Region Sample
2013-10-18 05:10 1751IPhone and Location(2)Documents ... -
IPhone and Location(1)Documents User Location
2013-10-18 03:50 1322IPhone and Location(1)Documents ... -
Learn Objective C(6)Programming with Objective-C - Working with Blocks and Deali
2013-10-18 00:02 945Learn Objective C(6)Programming ... -
Learn Objective C(5)Programming with Objective-C - Working with Protocols and Va
2013-10-17 23:47 1016Learn Objective C(5)Programming ... -
Learn Objective C(3)Programming with Objective-C - Defining Classes, Working wit
2013-10-17 23:09 1039Learn Objective C(3)Programmi ... -
Learn Objective C(2)Learn Objective-C in Day 6 - 4 ~ 6
2013-10-17 00:30 991Learn Objective C(2)Learn Obj ... -
Learn Object C(1) Learn Objective-C in Day 6 - 1 ~ 3
2013-10-17 00:22 1125Learn Object C(1) Learn Objec ... -
APNS(4)Recall the Process and Learn Java APNS
2013-04-18 02:48 3493APNS(4)Recall the Process and L ... -
Build the iOS Things with J2Objc
2013-04-12 03:25 2481Build the iOS Things with J2Obj ... -
APNS(3)Write the Easy Client App
2013-01-15 07:23 1749APNS(3)Write the Easy Client Ap ... -
APNS(2)Try to Finish the first Example
2013-01-14 07:56 1561APNS(2)Try to Finish the first ... -
Stanford Cource(1)MVC and Object-C
2012-12-14 14:04 1345Stanford Cource(1)MVC and Objec ... -
Some VI Tips
2012-11-15 04:48 1107Some VI Tips Today, I need to c ... -
MAC Mini Setup
2012-09-25 18:45 1353MAC Mini Setup I am dealing wit ... -
Android Talker(1)MAC Environment
2012-09-01 00:16 1942Android Talker(1)MAC Environmen ...
相关推荐
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
此数据集包含有关出租车行程的详细信息,包括乘客人数、行程距离、付款类型、车费金额和行程时长。它可用于各种数据分析和机器学习应用程序,例如票价预测和乘车模式分析。
把代码放到Word中,通过开发工具——Visual Basic——插入模块,粘贴在里在,把在硅基流动中申请的API放到VBA代码中。在Word中,选择一个问题,运行这个DeepSeekV3的宏就可以实现在线问答
【毕业设计】java-springboot+vue机动车号牌管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot-vue交通管理在线服务系统的开发源码(完整前后端+mysql+说明文档+LunW).zip