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
- 浏览: 2551610 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
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 597ionic UI(5)UI and Backend 1 Pr ... -
Stanford Cource(2)Demo App Caculator
2014-06-24 01:29 904Stanford Cource(2)Demo App Ca ... -
Mono on MAC
2014-06-04 03:27 986Mono on MACJust fine the tool f ... -
IOS7 App Development Essentials(4)IPhone5, IPhone5s, IPhone5c
2014-04-11 03:59 990IOS7 App Development Essentia ... -
IOS7 App Development Essentials(3)NSUserDefaults
2014-04-11 02:58 1012IOS7 App Development Essentia ... -
IPhone and Location(2)Documents Region Monitoring and Region Sample
2013-10-18 05:10 1738IPhone and Location(2)Documents ... -
IPhone and Location(1)Documents User Location
2013-10-18 03:50 1311IPhone and Location(1)Documents ... -
Learn Objective C(6)Programming with Objective-C - Working with Blocks and Deali
2013-10-18 00:02 933Learn Objective C(6)Programming ... -
Learn Objective C(5)Programming with Objective-C - Working with Protocols and Va
2013-10-17 23:47 1002Learn Objective C(5)Programming ... -
Learn Objective C(3)Programming with Objective-C - Defining Classes, Working wit
2013-10-17 23:09 1020Learn Objective C(3)Programmi ... -
Learn Objective C(2)Learn Objective-C in Day 6 - 4 ~ 6
2013-10-17 00:30 972Learn Objective C(2)Learn Obj ... -
Learn Object C(1) Learn Objective-C in Day 6 - 1 ~ 3
2013-10-17 00:22 1117Learn Object C(1) Learn Objec ... -
APNS(4)Recall the Process and Learn Java APNS
2013-04-18 02:48 3477APNS(4)Recall the Process and L ... -
Build the iOS Things with J2Objc
2013-04-12 03:25 2469Build the iOS Things with J2Obj ... -
APNS(3)Write the Easy Client App
2013-01-15 07:23 1723APNS(3)Write the Easy Client Ap ... -
APNS(2)Try to Finish the first Example
2013-01-14 07:56 1547APNS(2)Try to Finish the first ... -
Stanford Cource(1)MVC and Object-C
2012-12-14 14:04 1326Stanford Cource(1)MVC and Objec ... -
Some VI Tips
2012-11-15 04:48 1097Some VI Tips Today, I need to c ... -
MAC Mini Setup
2012-09-25 18:45 1336MAC Mini Setup I am dealing wit ... -
Android Talker(1)MAC Environment
2012-09-01 00:16 1931Android Talker(1)MAC Environmen ...
相关推荐
学习Objective-C之前,建议具备一定的C语言基础,了解基本的数据类型、控制流结构和指针操作。 ### See Also 参考文档和教程对于学习Objective-C非常有帮助。官方文档提供了详细的API参考和最佳实践指南。 ### ...
By the end of the book, you will be able to design your own automation testing framework and perform data-driven testing with Selenium WebDriver. Contents 1: BUILDING A SCALABLE SELENIUM TEST DRIVER ...
Key Features Explore the Selenium grid architecture ... Encapsulating Data in Data-Driven Testing Designing a Selenium Grid Third-Party Tools and Plugins Working Selenium WebDriver Framework Samples
### 关于Objective-C ...以上是对Objective-C基础概念和编程技巧的详细介绍,这些知识点对于理解和使用Objective-C语言至关重要。通过掌握这些概念和技术,开发者可以更高效地构建高质量的应用程序。
With a focus on practical examples and real-world scenarios, readers will learn how to build robust and scalable web applications using Angular 15's extensive features and enhancements.
Encapsulating Data and Exposing Methods in Java Chapter 7. Using Java Methods to Communicate Chapter 8. Using Java Constructors Chapter 9. Inheriting Code and Data in Java Chapter 10. ...
Objective-C是C语言的一个超集,增加了Smalltalk风格的消息传递机制和动态运行时特性。以下是从文档内容提取出的相关知识点: 1. 类(Class)和对象(Object):在Objective-C中,类是对象的蓝图。开发者定义类来...
Based on the provided information from the book "C# 3.0 With the .NET Framework 3.5 Unleashed," we can extract several key points and concepts that are essential for understanding the fundamentals of ...
- **Working with web fonts**: Discussed in terms of selecting and applying custom fonts to enhance the visual appeal of the game. ##### Chapter 3: Going Mobile This chapter delves into the ...
Classes are blueprints for creating objects, encapsulating data and functions. Objects are instances of classes, holding their own state and behavior. Inheritance enables code reusability by allowing...
They are the building blocks of programs, encapsulating data and functionality. For instance, a button on a form is an object that can trigger actions when clicked. #### B. Event-Driven Programming:...
one encapsulating the transition discontinuity and the other of a matched line to provide a corrective reference plane shift. This factorization permits incorporation of desired and corrective ...
how to combine Starlink and private applications with shell commands and constructs to create powerful and time-saving tools for performing repetitive jobs, creating data-processing pipelines, and ...
Object-oriented programming (OOP) is a paradigm that organizes code around objects and data, rather than actions and logic. - **Classes:** Classes define blueprints for objects. They specify the ...
dia Britannica[4] and the National Geographic Society[5] as 4/5 of the landmass of Eurasia – with the western portion of the latter occupied by Europe – located to the east of the Suez Canal, east ...